至简设计系列 您所在的位置:网站首页 JS 按钮控制电子时钟 至简设计系列

至简设计系列

2024-07-11 04:02| 来源: 网络整理| 查看: 265

–作者:小黑同学 本文为明德扬原创及录用文章,转载请注明出处!

1.1 总体设计 1.1.1 概述 数字时钟是采用数字电路技术实现时、分、秒计时显示的装置,可以用数字同时显示时,分,秒的精确时间并实现准确校时,具备体积小、重量轻、抗干扰能力强、对环境要求高、高精确性、容易开发等特性,在工业控制系统、智能化仪器表、办公自动化系统等诸多领域取得了极为广泛的应用,诸如自动报警、按时自动打铃、时间程序自动控制、定时广播、自定启闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电器的自动启用等。与传统表盘式机械时钟相比,数字时钟具有更高的准确性和直观性,由于没有机械装置,其使用寿命更长。

1.1.2 设计目标 本设计要求实现可设置的数字时钟(速度快10倍,每过0.1s,秒数加1),具体要求如下:

按下按键key1,时钟暂停,跳到设置时间状态,在按按键key1,回到正常状态。通过按键key2,选择要设置的位置,初始时设置秒低位,按一下,设置秒高位,再按下,设置分低位,依次类推,循环设置。通过按键key3,设置数值,按一下数值加1,如果溢出,则重新变为0。通过数码管将时间实时显示出来。如果开发板上的按键是矩阵键盘,那么要产生需要的按键信号,需要通过例化矩阵键盘模块来产生。

1.1.3 系统结构框图 系统结构框图如下所示: 结构图共分两个,如果使用的开发板上是普通按键的时候,对应的结构图是图一。如果使用的开发板上是矩阵键盘的时候,对应的结构图是图二。 在这里插入图片描述 图一

在这里插入图片描述 图二

1.1.4 模块功能 按键检测模块实现功能 将外来异步信号打两拍处理,将异步信号同步化; 实现20ms按键消抖功能,并输出有效按键信号。 矩阵键盘模块实现功能 将外来异步信号打两拍处理,将异步信号同步化; 实现20ms按键消抖功能; 实现矩阵键盘的按键检测功能,并输出有效按键信号。 时间产生模块实现功能 产生时间数据; 根据接收到的不同的按键信号,产生暂停、开启、设置时间的功能。 数码管显示模块实现功能 对接收到的时间数据进行译码。

1.1.5 顶层信号

信号名接口方向定义clk输入系统时钟,50Mhzrst_n输入低电平复位信号Key输入3位按键信号,开发板按键为矩阵键盘时,不需要该信号Key_col输入4位矩阵键盘列信号,默认高电平,开发板按键为普通按键时,不需要该信号Key_row输出4位矩阵键盘行信号,默认低电平,开发板按键为普通按键时,不需要该信号Segment输出8位数码管段选信号Seg_sel输出6位数码管位选信号

1.1.6 参考代码 下面是使用普通按键的顶层代码:

1.module key_clock( 2. clk , 3. rst_n , 4. key , 5. segment, 6. seg_sel 7.); 8. 9.parameter COUNT_TIME = 23'd500_0000; 10.parameter DELAY_TIME = 10000 ; 11.parameter SEG_WID = 8 ; 12.parameter SEG_SEL = 6 ; 13. 14.parameter KEY_S = 4 ; 15.parameter KEY_W = 3 ; 16. 17.input clk ; 18.input rst_n ; 19.input [ 2:0] key ; 20.output [ 7:0] segment ; 21.output [ 6:0] seg_sel ; 22. 23.wire [ 2:0] key_vld ; 24.wire [23:0] segment_data; 25.wire [ 3:0] cnt2 ; 26.wire [ 3:0] cnt3 ; 27.wire [ 3:0] cnt4 ; 28.wire [ 3:0] cnt5 ; 29.wire [ 3:0] cnt6 ; 30.wire [ 3:0] cnt7 ; 31. 32. 33. key_module uut0( 34. .clk (clk ), 35. .rst_n (rst_n ), 36. .key_in (key ), 37. .key_vld (key_vld) 38. ); 39. 40. 41. time_data uut1( 42. .clk (clk ), 43. .rst_n (rst_n ), 44. .key_vld (key_vld), 45. .cnt2 (cnt2 ), 46. .cnt3 (cnt3 ), 47. .cnt4 (cnt4 ), 48. .cnt5 (cnt5 ), 49. .cnt6 (cnt6 ), 50. .cnt7 (cnt7 ) 51. 52. ); 53. 54. 55. seg_disp uut2( 56. .clk (clk ), 57. .rst_n (rst_n ), 58. .segment (segment ), 59. .seg_sel (seg_sel ), 60. .segment_data (cnt7,cnt6,cnt5,cnt4,cnt3,cnt2) 61. 62. ); 63. 64. 65.endmodule 下面是使用矩阵键盘的顶层代码: 66.module key_clock_jvzhen( 67. clk , 68. rst_n , 69. key_col, 70. key_row, 71. segment, 72. seg_sel 73.); 74. 75.parameter COUNT_TIME = 23'd500_0000; 76.parameter DELAY_TIME = 10000 ; 77.parameter SEG_WID = 8 ; 78.parameter SEG_SEL = 6 ; 79. 80.parameter KEY_S = 4 ; 81.parameter KEY_W = 3 ; 82. 83.input clk ; 84.input rst_n ; 85.input [ 3:0] key_col ; 86.output [ 3:0] key_row ; 87.output [ 7:0] segment ; 88.output [ 6:0] seg_sel ; 89. 90.wire [ 3:0] key_vld ; 91.wire [ 3:0] cnt2 ; 92.wire [ 3:0] cnt3 ; 93.wire [ 3:0] cnt4 ; 94.wire [ 3:0] cnt5 ; 95.wire [ 3:0] cnt6 ; 96.wire [ 3:0] cnt7 ; 97. 98. 99. key_scan uut0( 100. .clk (clk ), 101. .rst_n (rst_n ), 102. .key_col (key_col), 103. .key_row (key_row), 104. .key_en (key_vld) 105. ); 106. 107. 108. time_data uut1( 109. .clk (clk ), 110. .rst_n (rst_n ), 111. .key_vld (key_vld), 112. .cnt2 (cnt2 ), 113. .cnt3 (cnt3 ), 114. .cnt4 (cnt4 ), 115. .cnt5 (cnt5 ), 116. .cnt6 (cnt6 ), 117. .cnt7 (cnt7 ) 118. 119. ); 120. 121. 122. seg_disp uut2( 123. .clk (clk ), 124. .rst_n (rst_n ), 125. .segment (segment ), 126. .seg_sel (seg_sel ), 127. .segment_data ({cnt7,cnt6,cnt5,cnt4,cnt3,cnt2}) 128. ); 129. 130. 131.endmodule

1.2 按键检测模块设计 1.2.1 接口信号

信号接口方向定义clk输入系统时钟rst_n输入低电平复位信号key_in输入按键输入key_vld输出按键按下指示信号

1.2.2 设计思路 硬件电路 在这里插入图片描述 独立式按键工作原理如上图所示,4条输入线连接到FPGA的IO口上,当按键S1按下时,3.3V的电源通过电阻R53再通过按键S1最终进入GND形成一条通路,这条线路的全部电压都加在R53上,则KS0是低电平。当松开按键后,线路断开,就不会有电流通过,KS0应该是3.3V,为高电平。我们可以通过KS0这个IO口的高低电平状态来判断是否有按键按下。其他按键原理与S1一致。 从图上可以看出,如果我们按下按键,那么按键就会接通并连接到低电平GND,如果我们没有按下,那么按键就会断开并接到3.3V,因此按键为低电平有效。通常的按键所用开关为机械弹性开关,当机械触点断开或者闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而机械式按键在闭合及断开的瞬间均伴随有一连串的抖动,如果不进行处理,会使系统识别到抖动信号而进行不必要的反应,导致模块功能不正常,为了避免这种现象的产生,需要进行按键消抖的操作

按键消抖 在这里插入图片描述 按键消抖主要分为硬件消抖和软件消抖。两个“与非”门构成一个RS触发器为常用的硬件消抖。软件方法消抖,即检测出键闭合后执行一个延时程序,抖动时间的长短由按键的机械特性决定,一般为5ms~20ms,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认按下按键操作有效。当检测到按键释放后,也要给5ms~20ms的延时,待后沿抖动消失后才能转入该键的处理程序。经过按键消抖的行人优先按键,判断按键有效后,按键信号传递给控制系统,控制系统再进入相应的处理程序。

由于按键按下去的时间一般都会大于20ms,为了达到不管按键按下多久,都视为按下一次的效果,提出以下计数器架构,如下图所示: 在这里插入图片描述 消抖计数器cnt:用于计算20ms的时间,加一条件为flag==0 &&(&key_in_ff1 == 0),表示当某个按键按下就开始计数;结束条件为100000,表示数到20ms就结束 按键:表示被按下的按键,没被按下时为高电平,按下后为低电平。 Flag_add:20ms指示信号,默认为低电平,当按键按键按下20ms后变为高电平,直到按键信号变为高电平,重新拉低。

1.2.3 参考代码 使用明德扬的计数器模板,可以很快速很熟练地写出按键消抖模块。

132.module key_module( 133. clk , 134. rst_n , 135. key_in , 136. key_vld 137.); 138.parameter DATA_W = 20 ; 139.parameter KEY_W = 3 ; 140.parameter TIME_20MS = 1_000_000 ; 141. 142.input clk ; 143.input rst_n ; 144.input [KEY_W-1 :0] key_in ; 145.output [KEY_W-1 :0] key_vld ; 146.reg [KEY_W-1 :0] key_vld ; 147.reg [DATA_W-1:0] cnt ; 148.wire add_cnt ; 149.wire end_cnt ; 150.reg flag_add ; 151.reg [KEY_W-1 :0] key_in_ff1 ; 152.reg [KEY_W-1 :0] key_in_ff0 ; 153. 154. 155.always @(posedge clk or negedge rst_n)begin 156. if(rst_n==1'b0)begin 157. cnt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有